package cmd

import (
	"fmt"
	"log"
	"time"

	"gorm.io/gorm"

	"BookStack/internal/domain/book"
	"BookStack/internal/domain/user"
)

// 示例书籍状态
const (
	SampleBookStatusDraft     = 0 // 草稿
	SampleBookStatusPublished = 1 // 已发布
)

// 示例书籍推荐状态
const (
	SampleBookRecommendNone   = 0 // 不推荐
	SampleBookRecommendNormal = 1 // 推荐
)

// 示例书籍分类
const (
	SampleBookCategoryTechnology = 1 // 技术文档
	SampleBookCategoryBusiness   = 2 // 商业文档
	SampleBookCategoryGuide      = 3 // 指南手册
)

// 示例书籍结构
type sampleBook struct {
	Title       string
	Slug        string
	Author      string
	Description string
	Cover       string
	ISBN        string
	CategoryID  uint
	CreatedBy   uint
	Chapters    []sampleChapter
}

// 示例章节结构
type sampleChapter struct {
	Title   string
	Slug    string
	Content string
	Order   int
}

// CreateSampleBooks 创建示例书籍
func CreateSampleBooks(db *gorm.DB) error {
	log.Println("正在创建示例书籍...")

	// 检查是否已存在示例书籍
	var count int64
	db.Model(&book.Book{}).Count(&count)
	if count > 0 {
		log.Println("已存在书籍数据，跳过创建示例书籍")
		return nil
	}

	// 获取管理员ID（用于设置书籍创建者）
	var admin user.User
	if err := db.Where("role = ?", "superadmin").First(&admin).Error; err != nil {
		return fmt.Errorf("获取超级管理员失败: %v", err)
	}

	adminID := admin.ID
	if adminID == 0 {
		return fmt.Errorf("未找到管理员账户")
	}

	// 示例书籍集合
	sampleBooks := []sampleBook{
		{
			Title:       "BookStack用户手册",
			Slug:        "bookstack-manual",
			Author:      "BookStack开发团队",
			Description: "这是BookStack知识管理系统的官方用户手册，包含了详细的使用指南和最佳实践。",
			Cover:       "/static/images/bookstack-manual-cover.jpg",
			ISBN:        "978-1-234567-89-0",
			CategoryID:  SampleBookCategoryGuide,
			CreatedBy:   adminID,
			Chapters: []sampleChapter{
				{
					Title:   "第一章：入门指南",
					Slug:    "getting-started",
					Content: getBookStackManualChapter1(),
					Order:   1,
				},
				{
					Title:   "第二章：创建和管理内容",
					Slug:    "content-management",
					Content: getBookStackManualChapter2(),
					Order:   2,
				},
				{
					Title:   "第三章：高级功能",
					Slug:    "advanced-features",
					Content: getBookStackManualChapter3(),
					Order:   3,
				},
			},
		},
		{
			Title:       "开发者指南",
			Slug:        "developer-guide",
			Author:      "技术团队",
			Description: "面向开发者的技术指南，介绍如何扩展和定制BookStack系统。",
			Cover:       "/static/images/developer-guide-cover.jpg",
			ISBN:        "978-2-345678-90-1",
			CategoryID:  SampleBookCategoryTechnology,
			CreatedBy:   adminID,
			Chapters: []sampleChapter{
				{
					Title:   "第一章：架构概览",
					Slug:    "architecture-overview",
					Content: "本章将介绍BookStack的整体架构设计和技术栈选择...",
					Order:   1,
				},
				{
					Title:   "第二章：API接口",
					Slug:    "api-interface",
					Content: "本章详细说明BookStack提供的API接口和认证机制...",
					Order:   2,
				},
			},
		},
	}

	now := time.Now()

	// 逐个创建示例书籍
	for _, sample := range sampleBooks {
		// 检查书籍是否已存在
		var bookCount int64
		db.Model(&book.Book{}).Where("slug = ?", sample.Slug).Count(&bookCount)
		if bookCount > 0 {
			log.Printf("书籍'%s'已存在，跳过创建\n", sample.Title)
			continue
		}

		// 创建新书籍实体
		newBook, err := book.NewBook(
			sample.Title,
			sample.Slug,
			sample.Author,
			sample.Description,
			sample.Cover,
			sample.ISBN,
			sample.CategoryID,
			sample.CreatedBy,
		)
		if err != nil {
			return fmt.Errorf("创建示例书籍'%s'失败: %v", sample.Title, err)
		}

		// 发布书籍
		if err := newBook.Publish(sample.CreatedBy); err != nil {
			return fmt.Errorf("发布示例书籍'%s'失败: %v", sample.Title, err)
		}

		// 设置创建和发布时间
		newBook.CreatedAt = now
		newBook.UpdatedAt = now
		publishTime := now
		newBook.PublishedAt = &publishTime

		// 保存到数据库
		if err := db.Create(newBook).Error; err != nil {
			return fmt.Errorf("保存示例书籍'%s'失败: %v", sample.Title, err)
		}

		log.Printf("示例书籍'%s'创建成功\n", sample.Title)

		// 创建章节
		for _, ch := range sample.Chapters {
			chapter, err := book.NewChapter(
				newBook.ID,
				ch.Title,
				ch.Slug,
				ch.Content,
				ch.Order,
				sample.CreatedBy,
			)
			if err != nil {
				return fmt.Errorf("创建章节'%s'失败: %v", ch.Title, err)
			}

			// 设置创建时间
			chapter.CreatedAt = now
			chapter.UpdatedAt = now

			// 保存到数据库
			if err := db.Create(chapter).Error; err != nil {
				return fmt.Errorf("保存章节'%s'失败: %v", ch.Title, err)
			}

			log.Printf("章节'%s'创建成功\n", ch.Title)
		}
	}

	log.Println("示例书籍创建完成")
	return nil
}

// 以下是示例书籍章节内容

// getBookStackManualChapter1 BookStack用户手册第一章内容
func getBookStackManualChapter1() string {
	return `
# 第一章：入门指南

欢迎使用BookStack知识管理系统！本章将帮助您快速上手BookStack的基本功能。

## 系统概述

BookStack是一个现代化的知识管理和文档协作平台，专为团队和个人设计。它提供了直观的界面和强大的功能，帮助您组织、分享和访问知识。

## 注册和登录

1. 访问BookStack首页
2. 点击右上角的"注册"按钮
3. 填写用户名、电子邮件和密码
4. 验证您的电子邮件地址
5. 使用注册信息登录系统

## 界面介绍

登录后，您将看到主界面：

- **顶部导航栏**：搜索、通知和用户菜单
- **侧边栏**：分类、书籍列表和快捷链接
- **内容区**：显示书籍、章节或内容
- **操作按钮**：创建、编辑和管理内容的工具

## 基本操作

### 浏览书籍

1. 在侧边栏中选择一个书籍分类
2. 点击书籍封面或标题进入书籍页面
3. 使用目录导航查看各章节
4. 点击章节标题打开章节内容

### 搜索内容

1. 点击顶部导航栏的搜索框
2. 输入关键词
3. 按Enter键搜索
4. 在结果页面中查看匹配内容

## 个人设置

### 编辑个人资料

1. 点击右上角的用户头像
2. 选择"个人设置"
3. 更新您的个人信息
4. 上传自定义头像
5. 点击"保存"应用更改

### 安全设置

1. 在个人设置页面，选择"安全"选项卡
2. 更改您的密码
3. 设置两步验证（如可用）
4. 查看登录历史

## 常见问题

### 忘记密码怎么办？

在登录页面点击"忘记密码"链接，系统将发送重置密码的邮件到您的注册邮箱。

### 如何查看我的活动历史？

在个人设置中，选择"活动"选项卡可以查看您的操作历史。

### 系统支持哪些浏览器？

BookStack支持所有现代浏览器，包括Chrome、Firefox、Safari和Edge的最新版本。

---

下一章将介绍如何创建和管理内容，包括书籍、章节和页面的操作。
`
}

// getBookStackManualChapter2 BookStack用户手册第二章内容
func getBookStackManualChapter2() string {
	return `
# 第二章：创建和管理内容

本章将指导您如何在BookStack中创建和管理各类内容。

## 书籍管理

### 创建新书籍

1. 点击侧边栏的"创建"按钮
2. 选择"新建书籍"
3. 填写书籍信息：
   - 标题（必填）
   - 描述
   - 封面图片
   - 分类
4. 点击"创建"按钮完成

### 编辑书籍信息

1. 在书籍页面，点击"管理"按钮
2. 选择"编辑书籍"
3. 修改书籍信息
4. 点击"保存"应用更改

### 管理书籍权限

1. 在书籍页面，点击"管理"按钮
2. 选择"权限设置"
3. 配置访问权限：
   - 公开（所有人可见）
   - 受限（仅特定用户或组可见）
   - 私有（仅创建者可见）
4. 点击"保存"应用更改

## 章节管理

### 创建新章节

1. 进入书籍页面
2. 点击"添加章节"按钮
3. 填写章节信息：
   - 标题（必填）
   - 简短描述
4. 点击"创建"按钮

### 编辑章节内容

1. 进入章节页面
2. 点击"编辑"按钮
3. 使用Markdown编辑器编写内容
4. 预览内容效果
5. 点击"保存"按钮

### 重排章节顺序

1. 在书籍页面，点击"管理"按钮
2. 选择"章节排序"
3. 拖放章节调整顺序
4. 点击"保存"应用更改

## 内容格式化

### Markdown基础语法

BookStack使用Markdown语法格式化内容：

- **标题**：使用 # 符号（# 一级标题，## 二级标题，以此类推）
- **粗体**：使用 **文本** 格式
- **斜体**：使用 *文本* 格式
- **链接**：使用 [链接文本](URL) 格式
- **图片**：使用 ![替代文本](图片URL) 格式
- **列表**：使用 - 或 1. 创建无序或有序列表
- **引用**：使用 > 符号开始引用文本
- **代码块**：使用 ''' 包裹代码

### 插入媒体内容

1. 在编辑器中点击"插入"按钮
2. 选择要插入的媒体类型（图片、视频、文件等）
3. 上传文件或提供URL
4. 调整显示选项
5. 插入到内容中

## 版本控制

### 查看历史版本

1. 在章节页面，点击"历史"按钮
2. 浏览不同的版本修改
3. 比较版本差异

### 恢复到历史版本

1. 在历史页面，找到要恢复的版本
2. 点击"恢复到此版本"按钮
3. 确认恢复操作

## 导入和导出

### 导入内容

1. 在书籍页面，点击"管理"按钮
2. 选择"导入内容"
3. 选择导入格式（Markdown, HTML, DOCX等）
4. 上传文件
5. 配置导入选项
6. 点击"导入"按钮

### 导出内容

1. 在书籍页面，点击"导出"按钮
2. 选择导出格式（PDF, EPUB, Markdown等）
3. 配置导出选项
4. 点击"导出"按钮
5. 下载导出的文件

---

下一章将介绍BookStack的高级功能，包括团队协作、API集成和自定义设置。
`
}

// getBookStackManualChapter3 BookStack用户手册第三章内容
func getBookStackManualChapter3() string {
	return `
# 第三章：高级功能

本章介绍BookStack的高级功能和使用技巧，帮助您充分利用系统的全部潜力。

## 团队协作

### 创建和管理团队

1. 进入"管理"页面
2. 选择"团队"选项卡
3. 点击"创建团队"按钮
4. 设置团队名称和描述
5. 邀请成员加入

### 协作编辑

BookStack支持多人同时编辑内容：

- 实时查看谁正在编辑特定页面
- 自动合并非冲突的更改
- 冲突解决机制
- 评论和讨论功能

### 任务分配

1. 在书籍或章节页面，点击"任务"按钮
2. 创建新任务
3. 分配给团队成员
4. 设置截止日期和优先级
5. 跟踪任务完成情况

## 自定义设置

### 主题定制

1. 进入"管理"页面
2. 选择"外观"选项卡
3. 自定义颜色方案
4. 上传自定义Logo
5. 调整布局选项

### 插件系统

1. 进入"管理"页面
2. 选择"插件"选项卡
3. 浏览可用插件
4. 安装所需插件
5. 配置插件设置

### 自定义模板

1. 进入"管理"页面
2. 选择"模板"选项卡
3. 创建或编辑模板
4. 设置默认模板
5. 应用模板到特定内容

## API集成

### API密钥管理

1. 进入个人设置
2. 选择"API"选项卡
3. 创建新的API密钥
4. 设置权限范围
5. 复制并安全存储生成的密钥

### 基础API使用

主要API端点：

- /api/books - 书籍管理
- /api/chapters - 章节管理
- /api/users - 用户管理
- /api/search - 搜索功能

示例请求：

'''
curl -X GET https://your-bookstack-url.com/api/books 
  -H "Authorization: Token YourTokenHere"
'''

### Webhook集成

1. 进入"管理"页面
2. 选择"Webhook"选项卡
3. 创建新的Webhook
4. 配置触发事件和目标URL
5. 测试Webhook连接

## 高级搜索

### 搜索语法

BookStack支持高级搜索语法：

- title:"关键词" - 在标题中搜索
- content:"关键词" - 在内容中搜索
- created_by:"用户名" - 查找特定用户创建的内容
- updated_after:"2023-01-01" - 时间筛选
- +必须包含 -必须排除 - 包含和排除条件

### 保存搜索

1. 执行高级搜索
2. 点击"保存此搜索"
3. 命名保存的搜索
4. 在侧边栏访问保存的搜索

## 内容分析

### 访问统计

1. 在书籍页面，点击"管理"按钮
2. 选择"统计"选项卡
3. 查看访问数据：
   - 总浏览量
   - 独立访问者
   - 热门章节
   - 访问时间分布

### 内容评估

1. 使用评分功能对内容进行评估
2. 查看读者反馈
3. 分析内容完整度
4. 监控更新频率

### 导出报告

1. 在"统计"页面，点击"导出报告"
2. 选择报告类型和时间范围
3. 配置包含的数据
4. 下载CSV或PDF格式的报告

## 安全与备份

### 设置自动备份

1. 进入"管理"页面
2. 选择"备份"选项卡
3. 配置自动备份：
   - 频率
   - 备份内容
   - 存储位置

### 数据导出

1. 进入"管理"页面
2. 选择"数据"选项卡
3. 点击"导出全部数据"
4. 选择导出格式
5. 下载数据归档文件

---

恭喜！您已完成BookStack用户手册的学习。现在您已经掌握了从基础到高级的全部功能，可以充分利用BookStack提升您的知识管理效率。如有更多问题，请随时查阅我们的在线帮助中心或联系技术支持团队。
`
}
